﻿using System;
using System.IO;

namespace Ukagaka.Named.Ghost.Shiori
{
	/// <summary>
	/// レスポンスを表現します
	/// </summary>
	public class Response : Message, IResponse
	{
		/// <summary>
		/// ステータスコードを取得します
		/// </summary>
		private StatusCodeType _StatusCode;

		/// <summary>
		/// ステータスコードを取得します
		/// </summary>
		public StatusCodeType StatusCodeType
		{
			get
			{
				return _StatusCode;
			}
			set
			{
				_StatusCode = value;

				Reason = _StatusCode.ToString( );
			}
		}

		/// <summary>
		/// ステータスの理由を取得します
		/// </summary>
		public string Reason
		{
			get;
			set;
		}

		/// <summary>
		/// レスポンスを初期化します
		/// </summary>
		public Response( )
		{
			// nothing
		}

		/// <summary>
		/// レスポンスを初期化します
		/// </summary>
		/// <param name="response">レスポンス</param>
		public Response( string response )
		{
			Parse( response );
		}

		/// <summary>
		/// レスポンスを取得します
		/// </summary>
		/// <returns>レスポンス</returns>
		public override string ToString( )
		{
			return string.Concat( Protocol, " ", ( int )StatusCodeType, " ", Reason, "\r\n", base.ToString( ) );
		}

		/// <summary>
		/// レスポンスを解析します
		/// </summary>
		/// <param name="response">レスポンス</param>
		public override void Parse( string response )
		{
			using ( var sr = new StringReader( response ) )
			{
				var split = sr.ReadLine( ).Split( new char[ ] { ' ' }, 3, StringSplitOptions.RemoveEmptyEntries );

				Protocol = new Protocol( split[ 0 ].Trim( ) );
				StatusCodeType = new StatusCode( split[ 1 ].Trim( ) ).Value;
				Reason = split[ 2 ].Trim( );

				base.Parse( sr.ReadToEnd( ) );
			}
		}
	}

	/// <summary>
	/// レスポンスを定義します
	/// </summary>
	public interface IResponse : IMessage
	{
		/// <summary>
		/// ステータスコードを取得します
		/// </summary>
		StatusCodeType StatusCodeType
		{
			get;
		}

		/// <summary>
		/// ステータスの理由を取得します
		/// </summary>
		string Reason
		{
			get;
		}
	}
}
